#!/bin/bash

# =============================================================================
# Fedora Workstation 42 开发环境自动化配置脚本
# 功能：安装 Java、Node.js、Rust、Git、VS Code、Docker 等开发工具与环境
# 使用方法：chmod +x fedora-dev-setup.sh && ./fedora-dev-setup.sh
# 注意：请在已配置好网络和基础系统的 Fedora 上运行（建议先运行系统初始化脚本）
# =============================================================================

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色

# 打印信息函数
print_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查是否以普通用户运行（避免 root 直接执行）
check_user() {
    if [ "$EUID" -eq 0 ]; then
        print_error "请不要以 root 用户运行此脚本！"
        print_info "脚本会通过 sudo 自动提权执行需要的操作。"
        exit 1
    fi
}

# 安装常用开发工具
install_dev_tools() {
    print_info "正在安装常用开发工具..."
    
    podman_ver=$(podman --version)
    podman_compose_ver=$(podman-compose --version)
    # Podman（推荐使用官方 Docker Engine）
    if ! command -v podman &> /dev/null; then
        print_info "正在安装 Podman..."
        sudo dnf install -y podman podman-compose
        print_success "podman 安装成功：$podman_ver，podman-compose：$podman_compose_ver"
    else
        sudo dnf install -y podman-compose
        print_success "podman 默认已经安装：$podman_ver，podman-compose：$podman_compose_ver"
    fi
    

# 启用用户级 socket
systemctl --user enable --now podman.socket
systemctl --user status podman
# https://github.com/containers/podman/blob/cea9340242f3f6cf41f20fb0b6239aa3db5decd6/docs/tutorials/socket_activation.md
# cat /usr/lib/systemd/user/podman.socket
# ls $XDG_RUNTIME_DIR/podman/podman.sock
# unix:///run/user/1000/podman/podman.sock
# podman info

sudo flatpak install flathub com.github.marhkb.Pods -y
# 打开 Pods 软件，点击 “新建连接” 然后选择使用默认的 “Unix Socket” 点击 Connect
# IDEA 连接 Podman：按 Ctrl+Alt+S 打开设置，然后选择 构建、执行、部署 | Docker。点击 "添加"按钮 以添加 Docker 配置。选择 Unix 套接字 ，然后下拉选择 rootless 版地址

    # 主要用于 登录到容器镜像仓库（Registry），以便拉取（pull）私有镜像或推送（push）镜像到仓库。
    # lcqh2635@gmail.com
    # podman login
    # 配置国内加速镜像仓库
    # cat /etc/containers/registries.conf
    # 备份到同目录（添加 .bak 后缀）
    sudo cp /etc/containers/registries.conf{,.bak}
    # 检查 .bak 文件是否存在
    # ls -l /etc/containers
    # 从同目录 .bak 文件恢复
    # sudo cp /etc/containers/registries.conf{.bak,}

sudo bash -c 'cat <<EOF >> /etc/containers/registries.conf

# 定义未指定镜像仓库前缀时，默认搜索的镜像仓库列表
# 例如执行 "podman pull nginx" 会自动从 "docker.io" 查找 "library/nginx"
unqualified-search-registries = ["docker.io"]

# Podman 优先尝试从 registry.mirror 拉取镜像，如果加速器不可用/镜像不存在，则自动回退到 location 指定的官方地址
# 官方仓库地址（最终回退地址）
[[registry]]
# 匹配的镜像仓库前缀（支持通配符 *）
# 例如 "docker.io" 会匹配所有 "docker.io/xxx" 的镜像
prefix = "docker.io"
# 实际访问的仓库服务器地址
# Docker Hub 的官方注册表地址
location = "registry-1.docker.io"

# 镜像加速器地址（优先使用的镜像源）
# 添加该仓库的镜像加速器（Mirror）以阿里云镜像加速为示例
[[registry.mirror]]
# 镜像加速器地址（替换为你的阿里云镜像加速URL）
location = "docker.1ms.run"
# 是否允许不安全的 HTTP 连接（生产环境建议 false）
insecure = false
EOF'

    
# 1. 创建网络
podman network create podman-net

# 运行 Redis 容器并启用密码认证（增强安全性）
# podman stop redis && podman rm redis
podman run -d \
  --name redis \
  --network podman-net \
  -p 6379:6379 \
  redis:latest redis-server --requirepass "479368"
# 使用 redis-cli 连接：
# podman exec -it redis redis-cli -a 479368

# 拉取官方 PostgreSQL 镜像并运行 PostgreSQL 容器
# podman stop postgres && podman rm postgres
podman run -d \
  --name postgres \
  --network podman-net \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=postgres \
  -e POSTGRES_DB=snail_job \
  -p 5432:5432 \
  postgres:latest
# 连接数据库（使用 psql 客户端）：
# podman exec -it postgres psql -U postgres -d test
cd ~/下载
git clone https://gitee.com/aizuda/snail-job.git
# 将脚本拷贝进容器，再在容器内执行（适用于 Podman/Docker）
# 将脚本复制到 postgres 容器中
podman cp ~/下载/snail-job/doc/sql/snail_job_postgre.sql postgres:/tmp/
# 在容器内执行
podman exec -i postgres psql -U postgres -d snail_job -f /tmp/snail_job_postgre.sql

cd ~/下载
curl -L -o nacos-server-3.1.0.tar.gz https://gh-proxy.com/https://github.com/alibaba/nacos/releases/download/3.1.0-bugfix/nacos-server-3.1.0.tar.gz
tar -zxvf nacos-server-3.1.0.tar.gz

# 2. 拉取官方 MySQL 镜像并运行 MySQL 容器
# podman stop mysql && podman rm mysql
podman run -d \
  --name mysql \
  --network podman-net \
  -e MYSQL_ROOT_PASSWORD=479368 \
  -e MYSQL_DATABASE=nacos_config \
  -e MYSQL_USER=lcqh2635 \
  -e MYSQL_PASSWORD=123456 \
  -p 3306:3306 \
  mysql:latest
# 将脚本拷贝进容器，再在容器内执行（适用于 Podman/Docker）
# 将脚本复制到 MySQL 容器中
podman cp ~/下载/nacos/conf/mysql-schema.sql mysql:/tmp/
podman cp ~/公共/Database/rbac-mysql-schema.sql mysql:/tmp/
# 在容器内执行导入
podman exec -it mysql mysql -u lcqh2635 -p nacos_config

USE nacos_config;
SOURCE /tmp/mysql-schema.sql;
EXIT;

# 方法一：使用 podman exec + mysql 客户端（推荐）
# 推荐方式：不复制文件，直接通过管道执行（避免文件残留）：
# 注意：-pMyRootPass123 中 不能有空格，否则会被视为交互式输入密码（卡住）。
cat ~/rbac-mysql-schema.sql | podman exec -i mysql mysql -u root -p479368
podman exec -it mysql mysql -u root -p479368 -e "DROP DATABASE IF EXISTS auth_center;"
# 如果你希望看到执行过程或错误信息，可以加 -v（verbose）或重定向日志：
cat ~/rbac-mysql-schema.sql | podman exec -i mysql mysql -u root -p479368 --verbose
cat ~/rbac-sample-data.sql | podman exec -i mysql mysql -u root -p479368 auth_center --verbose

# 方法二：先复制脚本进容器，再执行
# 1. 复制脚本到容器的 /tmp 目录
podman cp ~/rbac-mysql-schema.sql  mysql:/tmp/rbac-mysql-schema.sql 
# 2. 在容器内执行脚本
podman exec -it mysql mysql -u root -p479368 < /tmp/rbac-mysql-schema.sql 
# 验证执行结果
# 连接到 MySQL 容器并查询
podman exec -it mysql mysql -u root -p479368 -e "
  SHOW DATABASES LIKE 'auth_center';
  USE auth_center; 
  SHOW TABLES;
"
# 安全建议：生产环境不要用 root，可创建专用用户：
podman exec -it mysql mysql -u root -p479368 -e "
  CREATE USER 'auth_admin'@'localhost' IDENTIFIED BY '479368';
  GRANT ALL PRIVILEGES ON auth_center.* TO 'auth_admin'@'localhost';
  FLUSH PRIVILEGES;
"
# 查看所有 MySQL 用户的 SQL 命令
podman exec -it mysql mysql -u root -p479368 -e "SELECT User, Host FROM mysql.user;"
# 查看更详细的信息（如认证方式、账户状态等），可以：
podman exec -it mysql mysql -u root -p479368 -e "SELECT User, Host, plugin, account_locked, password_expired FROM mysql.user;"
podman exec -it mysql mysql -u lcqh2635 -p auth_center
# DBeaver 连接 MySQL 数据库报 Public Key Retrieval is not allowed 错误，这是由于 MySQL 8.0+ 默认用户使用 caching_sha2_password 认证方式。推荐在 DBeaver 连接设置中启用公钥检索（推荐 ✅）具体操作如下：
# 方法1：修改 DBeaver 连接属性（推荐）
步骤：
1、打开 DBeaver → 数据库 → 新建数据库连接 → MySQL
2、点击右下角的 → 编辑驱动设置 → 默认属性 → 鼠标右键，点击 "添加新属性"
3、添加以下两个属性：allowPublicKeyRetrieval true

# 方法2：修改连接URL，在连接设置中的 URL 字段末尾添加参数：
jdbc:mysql://localhost:3306/auth_center?allowPublicKeyRetrieval=true

# 在 Fedora（或其他 Linux 发行版）上使用 Podman 时，有多种方式可以查看容器内部的文件目录结构
# 进入容器的交互式 shell（如果容器有 sh/bash）
podman exec -it <容器名或ID> /bin/sh
# 例如：
podman exec -it mysql /bin/bash
ls /
ls /tmp/

# 使用容器内 mysql 客户端连接：
# podman exec -it mysql mysql -u lcqh2635 -p

# 拉取官方镜像并启动 Nacos 容器（推荐 2.3+ 版本）：
# 3. 启动 Nacos，直接通过容器名访问 MySQL
# Nacos 端口配置可参考官方 issue https://github.com/nacos-group/nacos-docker/issues/453
# podman stop nacos && podman rm nacos
podman run -d \
  --name nacos \
  --network podman-net \
  -p 8080:8080 \
  -p 7848:7848 \
  -p 8848:8848 \
  -p 9848:9848 \
  -p 9849:9849 \
  -e MODE=standalone \
  -e SPRING_DATASOURCE_PLATFORM=mysql \
  -e MYSQL_SERVICE_HOST=mysql \
  -e MYSQL_SERVICE_PORT=3306 \
  -e MYSQL_SERVICE_DB_NAME=nacos_config \
  -e MYSQL_SERVICE_USER=lcqh2635 \
  -e MYSQL_SERVICE_PASSWORD=123456 \
  -e NACOS_AUTH_ENABLE=true \
  -e NACOS_AUTH_IDENTITY_KEY="nacos" \
  -e NACOS_AUTH_IDENTITY_VALUE="nacos" \
  -e NACOS_AUTH_TOKEN="K7vQ2mRf9ZxLpN8sT1aB3cD4eF5gH6jK7lM8nO9pQ0rS1tU2vW3xY4zA5bC6dE=" \
  nacos/nacos-server:latest
# http://localhost:8080/index.html
# 查看容器的完整日志
podman logs <容器名或ID>
# 示例
podman logs nacos

# https://snailjob.opensnail.com/docs/guide/server/service_deployment.html
podman run -d \
  --name snail-job \
  --network podman-net \
  -e SPRING_DATASOURCE_USERNAME=postgres \
  -e SPRING_DATASOURCE_PASSWORD=postgres \
  -e SPRING_DATASOURCE_URL='jdbc:postgresql://localhost:5432/snail_job' \
  -e SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.postgresql.Driver \
  -p 8081:8080 \
  -p 17888:17888 \
  opensnail/snail-job:latest
# http://localhost:8000/snail-job
用户名: admin
密码: admin

    # podman images
    # podman ps
    
    

# 1. 创建 Pod，暴露 80 端口
podman pod create --name podman-pod -p 80:80
# 2. 在 Pod 中启动 Spring Boot 应用（监听 8080）
podman run -d --pod=podman-pod --name redis-stack \
  redis-stack:latest redis-server --requirepass "479368"
# 3. 在 Pod 中启动 Nginx（监听 80，反向代理到 localhost:8080）
podman run -d --pod=podman-pod --name nginx \
  -v $HOME/myapp/nginx.conf:/etc/nginx/nginx.conf:Z \
  registry.aliyuncs.com/library/nginx:alpine


podman run -d \
  --name redis \
  --network podman-net \
  -p 6379:6379 \
  redis:latest redis-server --requirepass "479368"

    print_success "开发工具安装完成！"
}

# 主函数
main() {
    print_info "开始配置 Fedora 开发环境..."

    check_user
    install_dev_base
    install_and_configure_git
    install_nodejs
    install_sdkman
    install_rust
    install_golang
    install_dev_tools

    print_success "=========================================="
    print_success "🎉 开发环境配置完成！"
    print_success "以下环境已就绪："
    print_success "  • Java (OpenJDK 21)"
    print_success "  • Node.js (LTS) + npm（使用国内镜像）"
    print_success "  • Rust（使用 rsproxy.cn 镜像加速）"
    print_success "  • Git、VS Code、Docker、常用 CLI 工具"
    print_success "=========================================="

    print_warning "📌 注意："
    print_warning "  • Docker 权限变更需重新登录或执行 'newgrp docker'"
    print_warning "  • 新终端需重新加载 shell 配置（或重启终端）以使用 Java/Rust 环境变量"
    print_warning "  • VS Code 可通过应用菜单启动，或命令行输入 'code'"

    echo
    read -p "是否现在启动 VS Code 进行测试？(y/N): " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        code --version &> /dev/null && code . || print_error "VS Code 启动失败，请手动启动。"
    fi
}

# 执行主流程
main "$@"
